Spring Security অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করতে পাসওয়ার্ড এনকোডিং এবং ব্যবস্থাপনার জন্য শক্তিশালী সমাধান প্রদান করে। পাসওয়ার্ড এনকোডিং ব্যবহারকারীর পাসওয়ার্ডকে প্লেইন-টেক্সটে সংরক্ষণ না করে একটি সুরক্ষিত এনকোডেড ফর্মে সংরক্ষণ নিশ্চিত করে।
Password Encoding কী এবং কেন প্রয়োজন?
Password Encoding হল এমন একটি প্রক্রিয়া যেখানে পাসওয়ার্ডকে একটি সুরক্ষিত এনকোডেড ফর্মে রূপান্তর করা হয়।
- এনকোড করা পাসওয়ার্ড ডাটাবেসে সংরক্ষণ করা হয়।
- এটি Hashing Algorithm ব্যবহার করে যা একমুখী (One-Way)।
- ডিকোড করা সম্ভব নয়, তবে Matching Algorithm এর মাধ্যমে যাচাই করা যায়।
Spring Security-তে Password Encoder
Spring Security বিভিন্ন পাসওয়ার্ড এনকোডার সরবরাহ করে, যেমন:
- BCryptPasswordEncoder
- Pbkdf2PasswordEncoder
- Argon2PasswordEncoder
- NoOpPasswordEncoder (শুধুমাত্র পরীক্ষার জন্য, নিরাপদ নয়)
BCryptPasswordEncoder উদাহরণ (সবচেয়ে বেশি ব্যবহৃত)
১. Maven Dependency যোগ করা
Spring Security ডিপেনডেন্সি:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
২. BCryptPasswordEncoder Bean তৈরি
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
৩. পাসওয়ার্ড এনকোড এবং যাচাই
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final PasswordEncoder passwordEncoder;
public UserService(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
public String encodePassword(String rawPassword) {
return passwordEncoder.encode(rawPassword); // Encode the raw password
}
public boolean matchesPassword(String rawPassword, String encodedPassword) {
return passwordEncoder.matches(rawPassword, encodedPassword); // Verify the password
}
}
৪. পাসওয়ার্ড এনকোড করা এবং যাচাই পরীক্ষা
public class PasswordEncodingDemo {
public static void main(String[] args) {
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String rawPassword = "mySecurePassword";
String encodedPassword = passwordEncoder.encode(rawPassword);
System.out.println("Encoded Password: " + encodedPassword);
boolean isMatched = passwordEncoder.matches(rawPassword, encodedPassword);
System.out.println("Password Match: " + isMatched);
}
}
আউটপুট:
Encoded Password: $2a$10$6d4kWjWzO9gXCNc9N4fXPOvOtb5qZ69jRb4/2szqFnQmiu.ypSZXm
Password Match: true
Spring Security-তে পাসওয়ার্ড ম্যানেজমেন্ট
১. In-Memory Authentication ব্যবহার
@Bean
public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) {
return new InMemoryUserDetailsManager(
User.withUsername("admin")
.password(passwordEncoder.encode("admin123"))
.roles("ADMIN")
.build(),
User.withUsername("user")
.password(passwordEncoder.encode("user123"))
.roles("USER")
.build()
);
}
২. Database Authentication ব্যবহার
Spring Security ব্যবহার করে ডাটাবেস থেকে পাসওয়ার্ড যাচাই করার উদাহরণ:
JPA Entity:
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String username;
private String password; // Encrypted password
private String role;
// Getters and setters
}
UserDetailsService Implementation:
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
return org.springframework.security.core.userdetails.User
.withUsername(user.getUsername())
.password(user.getPassword())
.roles(user.getRole())
.build();
}
}
Database Configuration:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());
}
Password Encoding টেকনিকগুলির তুলনা
| Encoder | Security Level | ব্যবহারযোগ্যতা |
|---|---|---|
| BCryptPasswordEncoder | অত্যন্ত নিরাপদ | সর্বাধিক ব্যবহৃত, Spring-এর ডিফল্ট। |
| Pbkdf2PasswordEncoder | অত্যন্ত নিরাপদ | Key derivation functions প্রয়োজন। |
| Argon2PasswordEncoder | সর্বোচ্চ নিরাপত্তা | আধুনিক, কমপ্লেক্স অ্যালগোরিদম। |
| NoOpPasswordEncoder | নিরাপদ নয় | শুধুমাত্র পরীক্ষার জন্য। |
Password Management বেস্ট প্র্যাকটিস
- Strong Encoding Algorithm ব্যবহার করুন (যেমন: BCrypt, Argon2)।
- পাসওয়ার্ড কখনো প্লেইন-টেক্সটে সংরক্ষণ করবেন না।
- ব্যবহারকারীর পাসওয়ার্ড পরিবর্তনের জন্য একটি সুরক্ষিত প্রক্রিয়া রাখুন।
- Password Salting যুক্ত করুন (BCrypt এবং Argon2 ডিফল্টভাবে এটি করে)।
- পাসওয়ার্ড ভুল করার সীমা নির্ধারণ করুন (Brute Force আক্রমণ প্রতিরোধে)।
উপসংহার
Spring Security-তে Password Encoding এবং Management নিরাপত্তার মূল স্তম্ভ। এটি পাসওয়ার্ড এনকোডিং, যাচাই, এবং ডাটাবেসে নিরাপদে সংরক্ষণ সহজ করে।
আপনার অ্যাপ্লিকেশনে কাস্টম পাসওয়ার্ড ম্যানেজমেন্ট বা এনকোডিং প্রয়োজন হলে নির্দ্বিধায় জানাতে পারেন!
Read more